package com.wechat.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;

import com.swak.annotation.Context;
import com.swak.annotation.FluxService;
import com.swak.utils.StringUtils;

/**
 * 机器人
 *
 * @author: lifeng
 * @date: 2020/3/28 17:14
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@FluxService
public @interface Robot {

	/**
	 * Robot id
	 * 
	 * @return 命令的名称
	 */
	String id() default StringUtils.EMPTY;
	
	/**
	 * Robot name
	 * 
	 * @return 命令的名称
	 */
	String name() default StringUtils.EMPTY;

	/**
	 * Robot summary
	 * 
	 * @return 命令的描述
	 */
	String summary() default StringUtils.EMPTY;

	/**
	 * @return 默认的处理方式
	 */
	String method() default "recv";

	/**
	 * 定义执行的线程池
	 * 
	 * @return
	 */
	@AliasFor(annotation = FluxService.class)
	Context context() default Context.Concurrent;

	/**
	 * 默认在统一的线程池中执行，每个执行者最多占用一半的线程
	 * 
	 * @return 可以设置在哪个 pool 中运行
	 */
	@AliasFor(annotation = FluxService.class)
	String pool() default StringUtils.EMPTY;

	/**
	 * 定义了 pool，此参数才会生效
	 * 
	 * @return 定义线程池的线程数
	 */
	@AliasFor(annotation = FluxService.class)
	int workers() default 1;

	/**
	 * 最大并发：占用一半的线程来执行任务 这里和设置 context = Context.Order 效果一样
	 * 
	 * @return 发布服务的个数
	 */
	@AliasFor(annotation = FluxService.class)
	int parallel() default 1;
}